package Util;

public final class Constants {
    /**
     * 枚举游戏中可能的移动。在每个时间步，需要一个控制器来提供可用的5个操作之一。
     * 如果控制器回复中立或未及时回复，则之前的操作是重复的。如果前一个动作不是合法动作，则统一随机选择合法动作。
     */
    public enum MOVE {
        UP {
            public MOVE opposite() {
                return MOVE.DOWN;
            }
        },
        RIGHT {
            public MOVE opposite() {
                return MOVE.LEFT;
            }
        },
        DOWN {
            public MOVE opposite() {
                return MOVE.UP;
            }
        },
        LEFT {
            public MOVE opposite() {
                return MOVE.RIGHT;
            }
        },
        NEUTRAL {
            public MOVE opposite() {
                return MOVE.NEUTRAL;
            }
        };

        public abstract MOVE opposite();
    }

    /**
     * 鬼魂的枚举。整型参数是初始的巢穴时间。
     */
    public enum GHOST {
        BLINKY(40), PINKY(60), INKY(80), SUE(100);

        public final int initialLairTime;

        GHOST(int lairTime) {
            this.initialLairTime = lairTime;
        }
    }

    /**
     * DM代表距离度量，是一个简单的枚举，用于需要距离度量的方法。
     * 这个可用指标如下：
     * 路径：实际路径距离（即达到目标所需的步数）
     * 欧几里得：欧几里德距离使用节点的x和y坐标
     * 曼哈顿：曼哈顿距离（绝对距离在x和y坐标之间）
     */
    public enum DM {
        PATH, EUCLID, MANHATTAN
    }

    //游戏规则相关常量
    public static final int MAP_WEIGHT = 25; // 地图宽度
    public static final int MAP_HEIGHT = 25; // 地图高度
    public static final int TWO_ROUNDS_COST = -1; // 由于饥饿，每两回合会消耗玩家的一分
    public static final int DEAD_SCORE = 0; // 当玩家积分低于0时，玩家将死亡

    //分数相关的常量
    public static final int INITIAL_SCORE = 10; // 糖豆人初始分数
    public static final int GHOST_EAT_SCORE = 6; //吃了鬼魂的分数
    public static final int PLAYER_SHOOT_SCORE = 10; //射杀其他玩家的分数
    public static final int APPLE_SCORE = 1; // 苹果的分数
    public static final int ORANGE_SCORE = 2; // 橘子的分数
    public static final int PINEAPPLE_SCORE = 3; // 菠萝的分数
    public static final int STRAWBERRY_SCORE = 4; // 草莓的分数
    public static final int WATERMELON_SCORE = 5; // 西瓜的分数
    public static final int SHOOT_SCORE = -3; // 开枪的分数



    public static final int PILL = 10; // 普通药丸的积分
    public static final int POWER_PILL = 50; // 一颗强力药丸的点数


    public static final int EDIBLE_TIME = 200; // 一个幽灵可以食用的初始时间（作为等级数减少/增加）
    public static final float EDIBLE_TIME_REDUCTION = 0.9f; // 食用时间按水平减少的折减系数/数量增加
    public static final float LAIR_REDUCTION = 0.9f; // 巢穴次数随层数增加而减少的折减系数

    public static final int LEVEL_RESET_REDUCTION = 6;
    public static final int COMMON_LAIR_TIME = 40; // 被吃掉后呆在巢穴里的时间
    public static final int LEVEL_LIMIT = 4000; // 级别的时间限制
    public static final float GHOST_REVERSAL = 0.0015f; // 全体幽灵反转事件的概率
    public static final int MAX_TIME = 24000; // 游戏可玩的最长时间
    public static final int AWARD_LIFE_LEFT = 800; // 在游戏结束时，每剩下一条生命（时间用完时）将获得积分

    public static final int EAT_DISTANCE = 2; // 在连通图中被认为足够接近一个进食事件发生的距离
    public static final int NUM_GHOSTS = 4; // 游戏中的鬼魂数量
    public static final int NUM_MAZES = 4; // 游戏中不同迷宫的数量
    // 用于真正游戏
    public static final int DELAY = 40; // 游戏进展之间的延迟（毫秒）
    public static final int NUM_LIVES = 3; // Ms Pac Man拥有的生命总数（当前+NUM_lives-1个备用）
    public static final int EXTRA_LIFE_SCORE = 10000; // 当收集到这么多的积分时，额外的生命被奖励

    // 用于测试
    // public static final int DELAY = 40; // 游戏进展之间的延迟（毫秒）
    // public static final int NUM_LIVES = 1; // Ms Pac Man拥有的生命总数（当前+NUM_lives-1个备用）
    // public static final int EXTRA_LIFE_SCORE = 10000000; // 当收集到这么多的积分时，额外的生命被奖励

    public static final int GHOST_SPEED_REDUCTION = 2; // 鬼魂可食时的速度差（每次鬼魂减速，鬼魂保持静止）
    public static final int EDIBLE_ALERT = 30; // 仅用于显示（重影变为蓝色）
    public static final int INTERVAL_WAIT = 1; // 为了更快地执行：检查每个间隔等待 ms以查看控制器是否已返回

    // 用于竞争
    public static final int WAIT_LIMIT = 5000; // time limit in milliseconds for the controller to initialise;
    public static final int MEMORY_LIMIT = 512; // memory limit in MB for controllers (including the game)
    public static final int IO_LIMIT = 10; // limit in MB on the files written by controllers

    // 用于迷宫
    public static final String pathMazes = "data/mazes";
    public static final String pathDistances = "data/distances";
    public static final String[] nodeNames = {"a", "b", "c", "d"};
    public static final String[] distNames = {"da", "db", "dc", "dd"};

    // 用于游戏窗口
    public static final int MAG = 2;
    public static final int GV_WIDTH = 114;
    public static final int GV_HEIGHT = 130;

    public static String pathImages = "data/images";
    public static String[] mazeNames = {"maze-a.png", "maze-b.png", "maze-c.png", "maze-d.png"};

    private Constants() {
    }
}
